package cl.utfsm.inf.lp;

import java.io.*;

public class MainClass {
	static Tablero tablero;

	/**
	 * @param args
	 * @throws IOException
	 * @throws NumberFormatException
	 */
	public static void main(String[] args) throws NumberFormatException,
	IOException {

		Integer pasos = 0;

		inicializarTablero();
		inicializarPersonajes();
		inicializarObjetos();

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("Ingrese Cantidad Pasos:");
		pasos = Integer.parseInt(br.readLine());

		for (int i = 0; i < pasos; i++) {
			if (i != 0)tablero.moverPersonajes();//se comienzan a mover los personajes despues del primer paso

			System.out.println("Tiempo: " + i);
			System.out.println("Personajes");

			for (int j = 0; j < tablero.getArregloPersonaje().length; j++) {
				//se leen los personajes desde el arreglo de personajes en el tablero
				System.out.print(" -"
						+ tablero.getArregloPersonaje()[j].getNombreTipo());
				System.out.print(" id: "
						+ tablero.getArregloPersonaje()[j].getId());

				if (tablero.getArregloPersonaje()[j].getEstado() == true) {
					// si el personaje esta vivo y activo...
					System.out
					.println(" Posicion: "
							+ tablero.getArregloPersonaje()[j]
							                                .getPosicion()[0]
							                                               + " "
							                                               + tablero.getArregloPersonaje()[j]
							                                                                               .getPosicion()[1]);

				} else
					System.out.println(" Muerto");

			}
			System.out.println("Objetos");
			for (int j = 0; j < tablero.getArregloObjeto().length; j++) {
				//se leen los objetos desde el arreglo de objetos en el tablero
				System.out.print(" -"
						+ tablero.getArregloObjeto()[j].getNombreTipo()
						+ " id: " + tablero.getArregloObjeto()[j].getId());
				if (tablero.getArregloObjeto()[j].getEstado() == true) {
					// si el objeto esta activo
					System.out.println(" Posicion: "
							+ tablero.getArregloObjeto()[j].getPosicion()[0]
							                                              + " "
							                                              + tablero.getArregloObjeto()[j].getPosicion()[1]);
				} else
					System.out.println(" Tomado");

			}

			verificarMovimientos();//procesa los movimientos de los personajes

		}

	}
	/**
	 * Se leen los personajes y objetos
	 * si las coordenadas del personaje coinciden con las de un objeto
	 * entonces el personaje bebe ese objeto
	 * si el efecto del objeto es un elixir se verifica si se permite su avance +1 en y
	 */
	private static void verificarMovimientos() {
		for (PersonajeExt per : tablero.getArregloPersonaje()) {
			for (ObjetoExt obj : tablero.getArregloObjeto()) {
				if (per.getPosicion()[0] == obj.getPosicion()[0]
				                                              && per.getPosicion()[1] == obj.getPosicion()[1]) {
					per.beber(obj);
					if (!obj.getEfecto()) {
						if (tablero.verificarMovimiento(per, 0, 1))
							per.setPosicion(per.getPosicion()[0],
									per.getPosicion()[1] + 1);
					}

				}

			}
		}

	}

	private static void inicializarTablero() throws NumberFormatException,
	IOException {

		int tamanio=0;
		// Creacion del flujo para leer datos

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));


		System.out.println("Ingrese Tamanio Tablero: ");
		tamanio = Integer.parseInt(br.readLine());
		tablero = new Tablero(tamanio);//se instacia el objeto tablero con su tamanio 

	}

	private static void inicializarObjetos() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		System.out.println("Ingrese Cantidad de Objetos: ");
		tablero.setCantObjetos(Integer.parseInt(br.readLine()));//setea el largo del arreglo de objetos

		tablero.setArregloObjeto(new ObjetoExt[tablero.getCantObjetos()]);

		for (int i = 0; i < tablero.getCantObjetos(); i++) {
			System.out.println("Objeto " + i + " Ingrese Tipo de Objeto:");
			int tipoObjeto = Integer.parseInt(br.readLine());

			if (tipoObjeto == 0)tablero.getArregloObjeto()[i] = new Veneno();//si el tipo es 0 objeto es un veneno
			if (tipoObjeto == 1)tablero.getArregloObjeto()[i] = new Elixir();//si el tipo es 1 objeto es un elixir

			System.out.println("Objeto " + i + " Ingrese Coordenadas x y: ");
			String[] pos = br.readLine().split(" ", 2);//se leen las coordenadas y se separan en x e y

			tablero.getArregloObjeto()[i].setPosicion(Integer.parseInt(pos[0]),
					Integer.parseInt(pos[1]));
			tablero.getArregloObjeto()[i].setId(i);

		}

	}

	private static void inicializarPersonajes() throws NumberFormatException,
	IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		System.out.println("Ingrese Cantidad de Personajes: ");
		tablero.setCantPersonajes(Integer.parseInt(br.readLine()));


		// setea el arreglo de personajes en el tablero
		tablero.setArregloPersonaje(new PersonajeExt[tablero
		                                             .getCantPersonajes()]);


		for (int i = 0; i < tablero.getCantPersonajes(); i++) {
			System.out
			.println("Personaje " + i + " Ingrese Tipo de Personaje:");
			int tipoPersonaje = Integer.parseInt(br.readLine());

			if(tipoPersonaje == 2)tablero.arregloPersonaje[i] = new Caballo(); //se instancia un caballo en el arreglo
			if(tipoPersonaje == 3)tablero.arregloPersonaje[i] = new Alfil();//se instancia un alfil en el arreglo
			if(tipoPersonaje == 4)tablero.arregloPersonaje[i] = new Peon();//se instancia un peon en el arreglo

			System.out
			.println("Personaje " + i + " Ingrese Coordenadas x y : ");

			String[] pos = br.readLine().split(" ",2);//se leen las coordenadas y se separan en x e y

			tablero.arregloPersonaje[i].setPosicion(Integer.parseInt(pos[0]),
					Integer.parseInt(pos[1]));
			tablero.arregloPersonaje[i].setId(i);
		}

	}

}
